//
//  Problem804.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/15.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 804. 唯一摩尔斯密码词
 国际摩尔斯密码定义一种标准编码方式，将每个字母对应于一个由一系列点和短线组成的字符串， 比如: "a" 对应 ".-", "b" 对应 "-...", "c" 对应 "-.-.", 等等。

 为了方便，所有26个英文字母对应摩尔斯密码表如下：

 [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
 给定一个单词列表，每个单词可以写成每个字母对应摩尔斯密码的组合。例如，"cab" 可以写成 "-.-..--..."，(即 "-.-." + ".-" + "-..." 字符串的结合)。我们将这样一个连接过程称作单词翻译。

 返回我们可以获得所有词不同单词翻译的数量。

 例如:
     输入: words = ["gin", "zen", "gig", "msg"]
     输出: 2
     解释:
     各单词翻译如下:
     "gin" -> "--...-."
     "zen" -> "--...-."
     "gig" -> "--...--."
     "msg" -> "--...--."

 共有 2 种不同翻译, "--...-." 和 "--...--.".
 注意:
     单词列表words 的长度不会超过 100。
     每个单词 words[i]的长度范围为 [1, 12]。
     每个单词 words[i]只包含小写字母。
 */
@objcMembers class Problem804: NSObject {
    func solution() {
        print(uniqueMorseRepresentations(["gin", "zen", "gig", "msg"]))
    }
    
    var lists = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
    
    /*
     1: 创建一个字典dp，[string: Int]
     2: dp[str] = 1 : 存储翻译后的秘文的个数
     3: 求dp的个数
     */
    func uniqueMorseRepresentations(_ words: [String]) -> Int {
        if words.count == 1 {
            return 1
        }
        var dp:[String:Int] = [:]
        for word in words {
            let charts = Array(word)
            var key = ""
            for c in charts {
                key += lists[ Int(c.asciiValue!) - 97 ]
            }
            if dp[key] == nil {
                dp[key] = 1
            }
        }
        return dp.count
    }
}
